package com.xsd.facade;

/**
 * 外观模式的注意事项和细节
 * 1) 外观模式对外屏蔽了子系统的细节，因此外观模式降低了客户端对子系统使用的复
 * 杂性
 * 2) 外观模式对客户端与子系统的耦合关系，让子系统内部的模块更易维护和扩展
 * 3) 通过合理的使用外观模式，可以帮我们更好的划分访问的层次
 * 4) 当系统需要进行分层设计时，可以考虑使用Facade模式
 * 5) 在维护一个遗留的大型系统时，可能这个系统已经变得非常难以维护和扩展，此时
 * 可以考虑为新系统开发一个Facade类，来提供遗留系统的比较清晰简单的接口，
 * 让新系统与Facade类交互，提高复用性
 * 6) 不能过多的或者不合理的使用外观模式，使用外观模式好，还是直接调用模块好。
 * 要以让系统有层次，利于维护为目的。
 */
public class HomeTheaterFacade {
	
	//定义各个子系统对象
	private TheaterLight theaterLight;
	private Popcorn popcorn;
	private Stereo stereo;
	private Projector projector;
	private Screen screen;
	private DVDPlayer dVDPlayer;
	
	
	//构造器
	public HomeTheaterFacade() {
		super();
		this.theaterLight = TheaterLight.getInstance();
		this.popcorn = Popcorn.getInstance();
		this.stereo = Stereo.getInstance();
		this.projector = Projector.getInstance();
		this.screen = Screen.getInstance();
		this.dVDPlayer = DVDPlayer.getInstanc();
	}

	//操作分成 4 步
	
	public void ready() {
		popcorn.on();
		popcorn.pop();
		screen.down();
		projector.on();
		stereo.on();
		dVDPlayer.on();
		theaterLight.dim();
	}
	
	public void play() {
		dVDPlayer.play();
	}
	
	public void pause() {
		dVDPlayer.pause();
	}
	
	public void end() {
		popcorn.off();
		theaterLight.bright();
		screen.up();
		projector.off();
		stereo.off();
		dVDPlayer.off();
	}


	
	
	
}
